С вещественными типами вроде как все нормально. Ставим обработку ошибок переполнения и все в норме. А вот с int не удается сделать обработку. Упорно VC не видит переполнения. Хотя если посмотреть в отладчике то флаг переполнения успешно выставляется.

Значит выход пока только один использовать ассемблер. Во первых для проверки нам нужно узнать максимальный размер int. Смотрим limits.h
#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */
Так, создаем программу Win32 Console.
#include "stdafx.h"
#include "iostream.h"
void main()
{
int i=2147483647; // максимальное значение
int g=1; // вторая часть сложения
int k=0; // флаг переполнения
}
Ну а теперь код сложения пишем на ассемблере.
#include "stdafx.h"
#include "iostream.h"
void main()
{
int i=2147483647; // максимальное значение
int g=1; // вторая часть сложения
int k=0; // флаг переполнения
_asm
{
pushf // сохраняем флаги
push ecx // сохраняем регистр который будем использовать
mov ecx,dword ptr [i] // из переменной в регистр
add ecx,dword ptr [g] // складываем
mov dword ptr [i],ecx // результат назад
jo overflow // переход по переполнению
jmp endover; // небыло переполнения
overflow: // переполнение
mov dword ptr [k],1 // установим флаг
endover:
pop ecx // восстановить регистр
popf // восстановить флаги
}
if (k==1) cout << "Overflow " << endl;
else cout << "OK" << endl;
}
Вот сейчас должно быть переполнение, так как мы выходим за границу int.

А теперь попробуем уменьшить числа, что бы убедиться что переполнения нет.
int i=2147483646; // максимальное значение
А все остальное так же. Запускаем.

Вроде как сработало. А на другую границу ?
int i=-2147483647 ; // максимальное значение int g=-2; // вторая часть сложения
Запускайте, сработает.